Dockerfile에 ubuntu-nginx-php를 만들고 RDS와 연동해 보기 – 서버 구축편
안녕하세요 클래스메소드 김재욱(Kim Jaewook) 입니다. 이번에는「Dockerfile에 ubuntu-nginx-php를 만들고 RDS와 연동해 보기」라는 주제로 Docker와 AWS 서비스인 RDS를 연동해 보는 블로그를 써볼까 합니다. 일본어로 쓴 내용은 여기를 참고해주세요!
이전에 집필한 Docker 블로그는 아래 링크를 참고해주세요.
- 「초심자용」일단 도전해 본 Docker
- EC2에 또 하나의 서버를 구축해봤다
- Docker의 Registry와 Private registry에 대해서
- Docker로 Xampp와 WordPress를 설치해서 블로그를 구축
- Dockerfile에 ubuntu-nginx-php를 만들고 RDS와 연동해 보기 – RDS 연동편
기본 환경설정
이번에는 dockerfile에 ubuntu를 베이스로 해서 nginx와 php를 설치하는 작업을 해보도록 하겠습니다. 현재 작업들은 전부 AWS EC2에서 실행한 것이기 때문에 보안그룹 문제는 포트 번호를 보고 적당히 체크해주시면 됩니다!
그리고 따로 선행작업 없이 바로 dockerfile을 만들수 있다면 좋겠지만, 그게 어렵다면 서버에서 일일이 명령어를 쳐보면서 실행해보는 것이 좋습니다.
apt-get update apt-get install nginx apt install php-fpm apt-get install nano
먼저 apt update를 한 다음 nginx를 다운받습니다.
그리고 php가 아닌 php-fpm을 다운받게 되는데 php-fpm은 PHP FastCGI Process Manager의 약자로 GCI보다 좀 더 빠른 버전입니다. CGI는 실행할 때마다 새로운 프로세스를 생성해서 구동하는데, 이렇게 되면 부하가 심해서 느려지게 됩니다. 하지만 FastCGI는 이미 생성한 프로세스를 재활용하는 방법을 사용하기 때문에 처리가 더 빠르다는 장점이 있습니다.
하지만 왜 php-fpm이냐? 라고 하면 apache의 경우 apache용 php 모듈이 있기 때문에 알아서 php를 처리하게 되어있지만 nginx의 경우 php가 뭐 하는 녀석인지 전혀 모르기 때문에 php-fpm을 설치해서 nginx와 연동을 해야 합니다.
마지막으로 nano의 경우 nginx와 php를 연동하기 위해서는 텍스트를 수정해야 하기 때문에 nano를 설치했습니다.
cd /etc/nginx/sites-available
설치가 다 끝나면 해당 폴더로 들어갑니다.
nano default
그리고 ls를 입력해보면 default라는 파일이 있습니다. 설치한 nano로 텍스트를 수정해줍니다.
스크롤을 내리다 보면 root가 있는데 웹 파일이 작동할 경로를 의미합니다.
현재 /var/www/html 경로로 잡혀져있으니 html 폴더에 웹 파일을 올려서 실행하면 됩니다.
더 아래로 내려가보면 index, index.html이 있습니다
여기에 idnex.php를 넣어줘야 php파일을 실행할 수 있기 때문에 index.php를 넣어줍니다.
그리고 더 내려가 보면 php라고 주석처리가 되어있는 부분이 있습니다. 위 이미지와 같이 주석을 풀어줍니다. 그런 다음, 아래에 /var/run/php/php7.4-fpm.sock; 부분에서 php-fpm의 버전을 수정합니다. 제 환경에서는 php-fpm 버전이 7.4 버전이었기 때문에 7.4로 맞췄습니다.
작업이 끝났으면 컨트롤 + O 를 눌러서 저장하고 컨트롤 + X 를 눌러서 빠져나옵니다.
이제 php와 nginx 연동작업이 끝났기 때문에 제대로 적용이 됐는지 테스트해 볼 차례입니다.
cd /var/www/html rm index.nginx-debian.html nano index.php "hello world nginx-php-fpm"
"hello world nginx-php-fpm" 를 출력하는 index.php 파일을 만들어줍니다.
IP를 입력하고 들어가보면 nginx와 php가 잘 연동이 된 것을 볼 수 있습니다.
Docker 환경설정
마지막으로 dockerfile을 만들기전에 파일을 옮길 필요가 있습니다.
먼저 dockerfile을 어느 폴더에다 저장을 할지 정합니다. 저는 /home/ubuntu 디렉토리로 설정했습니다.
cd /etc/nginx/sites-available mv default /./home/ubuntu nano phpinfo.php -> <!--?php phpinfo(); ?--> 작성
먼저 nginx 폴더에서 좀전에 수정했던 default 파일을 /home/ubuntu 디렉토리로 이동시켜줍니다. 그리고 ubuntu 디렉토리에서 php가 연동이 됐는지 체크하기 위해서 phpinfo.php 파일을 하나 만들어줍니다.
그러면 현재 ubuntu 디렉토리에는 dockerfile 이라는 파일을 제외하고서 default, phpinfo.php 두개의 파일이 존재할 것 입니다.
Dockerfile 생성
이제부터 dockerfile을 만들어보도록 합시다!
FROM ubuntu:latest MAINTAINER "kim.jaewook@classmethod.jp" RUN apt-get update RUN apt-get install -y nginx RUN apt install -y php-fpm RUN apt-get install -y nano COPY default /etc/nginx/sites-available/ COPY phpinfo.php /var/www/html WORKDIR /etc/nginx CMD service php7.4-fpm start && nginx -g "daemon off;" EXPOSE 80
먼저 FROM은 어떤 이미지를 베이스로할지 선택합니다. FROM으로 선택한 이미지는 docker에서 다운로드를 하게 되는데 ubuntu:latest로 설정을 해두면ubuntu의 최신 버전을 다운로드합니다.
이어서 RUN 명령어를 입력해서 update를 실시하고, nginx, php-fpm을 다운로드 합니다. 여기서 nginx와 php-fpm을 다운로드할 때 YES, NO 선택입력이 뜨는데, 자동으로 yes를 입력하기 위해서 -y 옵션을 붙여넣어 줍니다.
그리고 현재 디렉토리에 있는 파일들을 복사해서 바꿔줘야 하기 때문에 COPY 명령어를 이용해서 바꿔 넣어줍니다. WORKDIR는 bash로 접근했을 때 처음 뜨는 경로를 의미하는데, 저 같은 경우 바로 nginx 폴더로 접근할 수 있도록 수정했습니다. CMD로 커맨드 명령어를 내릴 수 있는데, 먼저 php-fpm이 실행되도록 서비스 스타트를 했고, nginx는 전역으로 백그라운드에서 돌아가도록 명령어를 줬습니다.
마지막으로 expose에는 어떤 포트를 열어서 접근할 것인지에 대한 부분인데 저는 80번 포트를 줬습니다.
Dockerfile Build
docker build jaewook/ubuntu-nginx-php:v0.1
그럼 이제 dockerifle을 빌드해봅시다. 명령어는 위 명령어를 사용하면 됩니다.
빌드를 하고나면 다음과 같이 image가 만들어지게 됩니다.
docker create -i -t --name ubuntu-nginx-php -p 8000:80 image_ID
그럼 이제 컨테이너로 만들어봅시다! -i와 -t를 줘서 터미널 입출력을 할 수 있도록 만들었고 이름은 ubuntu-nginx-php로 했습니다. 그리고 포트는 80포트로 열려있지만, 일부러 포트 번호를 바꿔서 8000포트로 접속해 보겠습니다.
마지막으로 image 아이디값을 넣어주고 엔터를 눌러주면 컨테이너가 생성됩니다.
docker start container_ID
컨테이너가 생성되고나서 위 명령어를 입력하면 컨테이너가 실행됩니다.
Docker로 만든 Ubuntu에 접속
8000포트로 접속해보면 nginx가 잘 작동되는 것을 볼 수 있습니다.
그러면 이전에 만들어서 COPY로 넘겨줬던 phpinfo도 실행해봅시다!
주소창에 phpinfo.php 를 입력해주면 php도 잘 나오는 것을 볼 수 있습니다.
마지막으로
이제 또다시 ubuntu 환경에서 nginx와 php를 설치할 일이 있다면 일일이 명령어를 입력해서 전부 다 다운로드할 필요 없이 docker에서 해당 이미지만 내려받으면 바로 환경을 구축할 수 있습니다. 다음에는 구축한 ubuntu-nginx-php에 RDS까지 연동해보는 작업을 해보도록 하겠습니다.